#include "XPT2046.h"

void Delay_Us(__IO int us)
{
    for (int i = 0; i < us; i++)
    {
        uint8_t cs = 12;
        while (cs--);
    }
}

void XPT2046_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOF, ENABLE);
    
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_13; //CS
    GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_11; //MOSI
    GPIO_Init(GPIOF, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_0;  //SCK
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;
    GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_1;  //PEN
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_2;  //MISO
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    SPI_XPT2046_CS_HIGH();
}

//写一个字节
void XPT2046_Write_Byte(uint8_t data)
{
	uint8_t i;
	
//	SPI_XPT2046_CS_LOW();
	SPI_XPT2046_SCK_LOW();
	SPI_XPT2046_MOSI_LOW();
	
	for(i=0;i<8;i++)
	{
		if(data&0x80)
		{
			SPI_XPT2046_MOSI_HIGH();  
		}
		else
		{
			SPI_XPT2046_MOSI_LOW();
		}
		
		Delay_Us(5);
		
		SPI_XPT2046_SCK_HIGH();
		
		Delay_Us(5);
		
		SPI_XPT2046_SCK_LOW();		
		
		data <<= 1;
	}
	
//	SPI_XPT2046_CS_HIGH();	

}

//读取数据
uint16_t XPT2046_Read_data(void)
{
	uint8_t i;
	uint16_t re_data = 0;
	
	SPI_XPT2046_SCK_HIGH();
	SPI_XPT2046_MOSI_LOW();
	
	for(i=0;i<12;i++)
	{
		re_data <<= 1;
		
		SPI_XPT2046_SCK_LOW();
		Delay_Us(5);
		SPI_XPT2046_SCK_HIGH();
		
		re_data |= SPI_XPT2046_MISO();
		
	}	
    printf("%d\r\n",re_data);
	return re_data;
}

//读取adc数据
uint16_t XPT2046_Read_adc(uint8_t cmd)
{
	uint16_t temp;
	
	SPI_XPT2046_CS_LOW();
	
	XPT2046_Write_Byte(cmd);
	
	temp = XPT2046_Read_data();	
	
	SPI_XPT2046_CS_HIGH();	
	
	return temp;
}

